package com.demo;

import com.alibaba.fastjson.JSON;
import com.demo.domain.model.ArticleFunctionRequest;
import com.demo.domain.model.ArticleFunctionResponse;
import com.demo.domain.service.CSDNArticleService;
import com.demo.infrastructure.gateway.ICSDNService;
import com.demo.infrastructure.gateway.dto.CSDNArticleRequest;
import com.demo.infrastructure.gateway.dto.CSDNArticleResponse;
import com.demo.type.utils.MarkdownConverter;
import jakarta.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import retrofit2.Response;

import java.io.IOException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApiTest {
    private final Logger log = LoggerFactory.getLogger(ApiTest.class);

    @Resource
    private ICSDNService csdnService;
    @Resource
    private CSDNArticleService csdnArticleService;

    /**
     * 自带cookie请求
     * 测试保存文章到CSDN
     * 注意：此测试需要有效的CSDN登录cookie才能成功
     */
    @Test
    public void testSaveArticle() {
        // 准备测试数据
        String cookie = "请替换为有效的CSDN登录cookie";

        CSDNArticleRequest request = new CSDNArticleRequest();
        request.setTitle("测试文章标题");
        request.setMarkdowncontent("# 测试文章内容\n这是一篇测试文章。");
        request.setContent("<h1>测试文章内容</h1><p>这是一篇测试文章</p>");
        request.setTags("测试, retrofit2");
        request.setCategories("测试分类");
        request.setDescription("测试文章描述");
        request.setAuthorized_status(true);
        request.setNot_auto_saved("0");

        try {
            // 调用接口
            Response<CSDNArticleResponse> response = csdnService.saveArticle(cookie, request).execute();

            // 处理响应
            if (response.isSuccessful() && response.body() != null) {
                CSDNArticleResponse articleResponse = response.body();
                log.info("保存文章成功，状态码：{}", articleResponse.getCode());
                log.info("文章ID：{}", articleResponse.getData() != null ? articleResponse.getData().getId() : null);
                log.info("文章URL：{}", articleResponse.getData() != null ? articleResponse.getData().getUrl() : null);
            } else {
                log.error("保存文章失败，HTTP状态码：{}", response.code());
                if (response.errorBody() != null) {
                    log.error("错误信息：{}", response.errorBody().string());
                }
            }
        } catch (IOException e) {
            log.error("保存文章发生异常", e);
        }
    }

    //md转html
    @Test
    public void testMdToHtml() {
        System.out.println(MarkdownConverter.convertToHtml("**关于DDD是什么，在维基百科有一个明确的定义。\\\"Domain-driven design (DDD) is a major software design approach.\\\" 也就是说DDD是一种主要的软件设计方法。而软件设计涵盖了；范式、模型、框架、方法论。**\\n\" +\n" +
                "                \"\\n\" +\n" +
                "                \"- 范式（paradigm）指的是一种编程思想。\\n\" +\n" +
                "                \"- 模型（model）指的是对现实世界或者问题的抽象描述。\\n\" +\n" +
                "                \"- 框架（framework）指的是提供了一系列通用功能和结构的软件工具。\\n\" +\n" +
                "                \"- 方法论（methodology）指的是一种系统的、有组织的解决问题的方法。\\n\" +\n" +
                "                \"\\n\" +\n" +
                "                \"所以，DDD不只是只有指导思想，伴随的DDD的还包括框架结构分层。但说到底，这些仍然是理论讨论。在没有一个DDD落地项目物参考下，其实大部分码农是没法完成DDD开发的。所以小傅哥今年花费了5个月假期/周末的时间，完成的《DDD简明开发教程》，帮助大家落地DDD编码。\n"));
    }

    //读取yml配置cookie版本的发送测试
    @Test
    public void test_domain_saveArticle() throws IOException {
        String json = "{\"content\":\"<h2>场景：</h2>\\n<p>在某互联网大厂的面试室，一位严肃的面试官正准备提问，而对面坐着一位看似紧张却又想显得轻松的程序员小张。</p>\\n<p><strong>面试官</strong>：我们先来聊聊Java核心知识。第一个问题，Java中的JVM是如何管理内存的？</p>\\n<p><strong>程序员小张</strong>：哦，这个简单！JVM就像一个巨大的购物车，负责把所有的变量都放进去，呃……然后就……管理起来？</p>\\n<p><strong>面试官</strong>：嗯，第二个问题，请说说HashMap的工作原理。</p>\\n<p><strong>程序员小张</strong>：HashMap嘛，就是……呃，一个很大的箱子，大家都往里面扔东西，有时候会打架……</p>\\n<p><strong>面试官</strong>：那么第三个问题，能不能讲讲Spring和SpringBoot的区别？</p>\\n<p><strong>程序员小张</strong>：Spring是……呃，春天？SpringBoot就是穿靴子的春天嘛！哈哈……</p>\\n<p><strong>面试官</strong>：好，今天的问题就问到这里。回去等通知吧。</p>\\n<h2>答案解析：</h2>\\n<ol>\\n<li>\\n<p><strong>JVM内存管理</strong>：JVM内存管理包括堆内存和栈内存，堆内存用于存储对象实例，栈内存用于执行线程时的栈帧。</p>\\n</li>\\n<li>\\n<p><strong>HashMap原理</strong>：HashMap通过哈希函数将键映射到对应的值，并通过链表解决哈希冲突。</p>\\n</li>\\n<li>\\n<p><strong>Spring与SpringBoot区别</strong>：Spring是一个大型应用框架，而SpringBoot是基于Spring的快速开发套件，简化了Spring应用的配置。</p>\\n</li>\\n</ol>\\n\",\"cover_images\":[],\"cover_type\":0,\"description\":\"在互联网大厂的面试中，严肃的面试官与搞笑的程序员上演了一场精彩的对话。面试官提出Java核心知识、HashMap、Spring等问题，程序员则用幽默的方式作答。本文不仅展现了轻松的面试氛围，还附上了详细的技术问题答案解析，帮助读者更好地理解相关知识。\",\"is_new\":1,\"level\":\"0\",\"markdowncontent\":\"## 场景：\\n\\n在某互联网大厂的面试室，一位严肃的面试官正准备提问，而对面坐着一位看似紧张却又想显得轻松的程序员小张。\\n\\n**面试官**：我们先来聊聊Java核心知识。第一个问题，Java中的JVM是如何管理内存的？\\n\\n**程序员小张**：哦，这个简单！JVM就像一个巨大的购物车，负责把所有的变量都放进去，呃……然后就……管理起来？\\n\\n**面试官**：嗯，第二个问题，请说说HashMap的工作原理。\\n\\n**程序员小张**：HashMap嘛，就是……呃，一个很大的箱子，大家都往里面扔东西，有时候会打架……\\n\\n**面试官**：那么第三个问题，能不能讲讲Spring和SpringBoot的区别？\\n\\n**程序员小张**：Spring是……呃，春天？SpringBoot就是穿靴子的春天嘛！哈哈……\\n\\n**面试官**：好，今天的问题就问到这里。回去等通知吧。\\n\\n## 答案解析：\\n\\n1. **JVM内存管理**：JVM内存管理包括堆内存和栈内存，堆内存用于存储对象实例，栈内存用于执行线程时的栈帧。\\n\\n2. **HashMap原理**：HashMap通过哈希函数将键映射到对应的值，并通过链表解决哈希冲突。\\n\\n3. **Spring与SpringBoot区别**：Spring是一个大型应用框架，而SpringBoot是基于Spring的快速开发套件，简化了Spring应用的配置。\",\"not_auto_saved\":\"0\",\"pubStatus\":\"draft\",\"readType\":\"public\",\"resource_id\":\"\",\"resource_url\":\"\",\"source\":\"pc_mdeditor\",\"status\":0,\"sync_git_code\":0,\"tags\":\"Java,面试,互联网,程序员,Spring,SpringBoot,HashMap,JVM\",\"title\":\"互联网大厂Java面试：严肃面试官与搞笑程序员的对决\",\"vote_id\":0}";
        ArticleFunctionRequest request = JSON.parseObject(json, ArticleFunctionRequest.class);
        ArticleFunctionResponse response = csdnArticleService.saveArticle(request);
        log.info("测试结果:{}", JSON.toJSONString(response));
    }
}
